/*
 * JInternalFrameVisor.java	
 *
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Created on 07/05/10, 11:29:57 PM
 */

package com.ufps.cuatro.vistas.analizador;

import java.util.ArrayList;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

import org.jdesktop.application.*;

import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.biblioteca.BibliotecaTrabajo;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.InformacionNodo;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.generadores.GeneradorArbol;
import com.ufps.cuatro.util.render.MyTreeCellRender;
import com.ufps.cuatro.controlador.render.UtilRender;

/**
 * <i><b>JInternalFrameVisor:</b></i> Es una Ventana que se utiliza para visualizar Coleeciones
 * de Objetos en JTree (árboles).
 *
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08 
 * @see javax.swing.JInternalFrame
 */
public class JInternalFrameVisor extends javax.swing.JInternalFrame {
    private static final long serialVersionUID = -8643245718521399251L;

    private ArrayList<?> objColeccion;
    private BibliotecaTrabajo objBiblioteca;
    private String strTitulo;
    private int tipoRenderer;
    private Object obj;
    private boolean aplicaBotonSeleccionar = false;
    private Object objParent;

  
    /**
     * @DefinicionMetodo
     * @param aplicaBotonSeleccionar @DefinicionParametro
     * @param objColeccion @DefinicionParametro
     * @param strTitulo @DefinicionParametro
     * @param tipoRenderer @DefinicionParametro
     */
    public JInternalFrameVisor(boolean aplicaBotonSeleccionar, ArrayList<ObjetoReflexion> objColeccion, String strTitulo, int tipoRenderer) {
        initComponents();
        this.aplicaBotonSeleccionar = aplicaBotonSeleccionar;
        this.objColeccion = objColeccion;
        this.strTitulo = strTitulo;
        this.tipoRenderer = tipoRenderer;
        this.setFrameIcon(Utileria.leerIconoApp(Utileria.MODO_16x16));
        this.jlblEEstructuraAnalizada.setText(strTitulo);
        if(!objColeccion.isEmpty()){
            this.crearEstructuraJar();
        }
        this.jButtonSeleccionar.setEnabled(aplicaBotonSeleccionar);
	this.jButtonVistaPrevia.setEnabled(false);
    }

    /** Creates new form JInternalFrameMundo
     * @param aplicaBotonSeleccionar @DefinicionParametro
     * @param objColeccion @DefinicionParametro
     * @param objVentana @DefinicionParametro
     * @param strTitulo @DefinicionParametro
     * @param tipoRenderer @DefinicionParametro
     */
    public JInternalFrameVisor(boolean aplicaBotonSeleccionar, Object objVentana, ArrayList<ObjetoTipoDatoReflexion> objColeccion, String strTitulo, int tipoRenderer) {
        initComponents();
        this.aplicaBotonSeleccionar = aplicaBotonSeleccionar;
        this.objParent = objVentana;
        this.objColeccion = objColeccion;
        this.strTitulo = strTitulo;
        this.tipoRenderer = tipoRenderer;
        this.setFrameIcon(Utileria.leerIconoApp(Utileria.MODO_16x16));
        this.jlblEEstructuraAnalizada.setText(strTitulo);
        if(!objColeccion.isEmpty()){
            this.crearEstructuraTipoDato();
        }
        this.jButtonSeleccionar.setEnabled(aplicaBotonSeleccionar);
	this.jButtonVistaPrevia.setEnabled(false);
    }

     /** Creates new form JInternalFrameMundo
     * @param aplicaBotonSeleccionar @DefinicionParametro
     * @param strTitulo @DefinicionParametro
     * @param objBiblioteca  @DefinicionParametro
     * @param objVentana @DefinicionParametro
     * @param tipoRenderer @DefinicionParametro
     */
    public JInternalFrameVisor(boolean aplicaBotonSeleccionar, Object objVentana, BibliotecaTrabajo objBiblioteca, String strTitulo, int tipoRenderer) {
        initComponents();
        this.aplicaBotonSeleccionar = aplicaBotonSeleccionar;
        this.objParent = objVentana;
        this.objBiblioteca = objBiblioteca;
        this.strTitulo = strTitulo;
        this.tipoRenderer = tipoRenderer;
        this.setFrameIcon(Utileria.leerIconoApp(Utileria.MODO_16x16));
        this.jlblEEstructuraAnalizada.setText(strTitulo);
        if(!objBiblioteca.isEmpty()){
            this.crearEstructuraBiblioteca();
        }
        this.jButtonSeleccionar.setEnabled(aplicaBotonSeleccionar);
	this.jButtonVistaPrevia.setEnabled(false);
    }

    /**
     * @DefinicionMetodo
     * @param aplicaBotonSeleccionar @DefinicionParametro
     * @param objParent @DefinicionParametro
     * @param strTitulo @DefinicionParametro
     * @param tipoRenderer @DefinicionParametro
     */
    public JInternalFrameVisor(boolean aplicaBotonSeleccionar, Object objParent, String strTitulo, int tipoRenderer) {
        initComponents();
        this.aplicaBotonSeleccionar = aplicaBotonSeleccionar;
        this.objParent = objParent;
        this.strTitulo = strTitulo;
        this.tipoRenderer = tipoRenderer;
        this.setFrameIcon(Utileria.leerIconoApp(Utileria.MODO_16x16));
        this.jlblEEstructuraAnalizada.setText(strTitulo);
        this.jButtonSeleccionar.setEnabled(aplicaBotonSeleccionar);        
	this.jButtonVistaPrevia.setEnabled(false);
    }        
    
    private void crearEstructuraJar(){
        try{
            DefaultMutableTreeNode objRaiz =
            GeneradorArbol.crearEstructuraClasesMundoJar(this.strTitulo, (ArrayList<ObjetoReflexion>)this.objColeccion);
            JTree objArbol = new JTree(objRaiz);
            this.jTreeColeccion.setModel(objArbol.getModel());
            MyTreeCellRender objRender = new MyTreeCellRender(this.tipoRenderer);
            this.jTreeColeccion.setCellRenderer(objRender);
        } catch (java.lang.NullPointerException ex) {
            Logger.getLogger(JInternalFrameVisor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void crearEstructuraTipoDato(){
        try{
            DefaultMutableTreeNode objRaiz =
            GeneradorArbol.crearEstructuraTiposDeDatos(this.strTitulo, (ArrayList<ObjetoTipoDatoReflexion>)this.objColeccion);
            JTree objArbol = new JTree(objRaiz);
            this.jTreeColeccion.setModel(objArbol.getModel());
            MyTreeCellRender objRender = new MyTreeCellRender(this.tipoRenderer);
            this.jTreeColeccion.setCellRenderer(objRender);
        } catch (java.lang.NullPointerException ex) {
            Logger.getLogger(JInternalFrameVisor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void crearEstructuraBiblioteca(){
        try{
            DefaultMutableTreeNode objRaiz =
            GeneradorArbol.crearEstructuraBibliotecaAll(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/analizador/resources/JInternalFrameVisor").getString("BIBLIOTECA"), this.objBiblioteca, false);
            JTree objArbol = new JTree(objRaiz);
            this.jTreeColeccion.setModel(objArbol.getModel());
            MyTreeCellRender objRender = new MyTreeCellRender(this.tipoRenderer);
            this.jTreeColeccion.setCellRenderer(objRender);
        }catch (java.lang.NullPointerException ex) {
            Logger.getLogger(JInternalFrameVisor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jlblEEstructuraAnalizada = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTreeColeccion = new javax.swing.JTree();
        jToolBar1 = new javax.swing.JToolBar();
        jButtonSeleccionar = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButtonVistaPrevia = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jButtonCerrar = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jButton1 = new javax.swing.JButton();

        setClosable(true);
        setIconifiable(true);
        setResizable(true);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/analizador/Bundle"); // NOI18N
        setTitle(bundle.getString("VISOR DE COLECCIONES")); // NOI18N
        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameClosing(evt);
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
            }
        });

        jlblEEstructuraAnalizada.setText(bundle.getString("MODELO ANALIZADO")); // NOI18N

        jTreeColeccion.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeColeccionValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jTreeColeccion);

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(JInternalFrameVisor.class, this);
        jButtonSeleccionar.setAction(actionMap.get("seleccionar")); // NOI18N
        jButtonSeleccionar.setFocusable(false);
        jButtonSeleccionar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonSeleccionar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonSeleccionar);
        jToolBar1.add(jSeparator1);

        jButtonVistaPrevia.setAction(actionMap.get("vistaPrevia")); // NOI18N
        jButtonVistaPrevia.setFocusable(false);
        jButtonVistaPrevia.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonVistaPrevia.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonVistaPrevia);
        jToolBar1.add(jSeparator2);

        jButtonCerrar.setAction(actionMap.get("cerrarVentana")); // NOI18N
        jButtonCerrar.setFocusable(false);
        jButtonCerrar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonCerrar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonCerrar);
        jToolBar1.add(jSeparator3);

        jButton1.setAction(actionMap.get("help")); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 360, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jlblEEstructuraAnalizada, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jlblEEstructuraAnalizada)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 383, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formInternalFrameClosing(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameClosing
//        String strMsg = Utileria.leerRecursoTexto("Utileria.msg.salir.window");
//        String strTitle = Utileria.leerRecursoTexto("Utileria.app.name");
//        if(Utileria.confirmarOrden(this, strMsg, strTitle)){
//            dispose();
//        }
    }//GEN-LAST:event_formInternalFrameClosing

    private void jTreeColeccionValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeColeccionValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();
        InformacionNodo objNodo = null;
        try {
            objNodo = (InformacionNodo) nodeInfo;
            if (node.isRoot()) {                
                obj = null;
            }
            else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja
                Object objTemp = objNodo.getObjElemento();
                obj = objTemp;
            }
            else {
                Object objTemp = objNodo.getObjElemento();
                obj = objTemp;
            }
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JInternalFrameVisor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jTreeColeccionValueChanged

    /**
     * Cierra la Ventana.
     */
    @Action
    public void cerrarVentana() {
        String strMsg = Utileria.leerRecursoTexto("Utileria.msg.salir.window");
        String strTitle = Utileria.leerRecursoTexto("Utileria.app.name");
        if(Utileria.confirmarOrden(this, strMsg, strTitle)){
            dispose();
        }
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void seleccionar() {
        if(obj == null){
            Utileria.mostrarMensaje(this,
                    java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/analizador/resources/JInternalFrameVisor").getString("LA SELECCIÓN NO ES VÁLIDA SELECCIONE UN COMPONENTE GENERADOR"), "",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        Bandera objBandera = new Bandera();        
        if(obj instanceof ObjetoTipoDatoReflexion){
            objBandera.setEstado(Bandera.SELECCION_TIPO_DATO_REFLEXION);
        }
        else if(obj instanceof Class){
            objBandera.setEstado(Bandera.SELECCION_CLASS);
        }
        objBandera.addObserver((Observer) objParent);
        objBandera.setObj(obj);
        objBandera.notificar();
        dispose();
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    @Action
    public Task vistaPrevia() {
        return new VistaPreviaTask(org.jdesktop.application.Application.getInstance(com.ufps.cuatro.CuatroApp.class));
    }

    private class VistaPreviaTask extends org.jdesktop.application.Task<Object, Void> {
        VistaPreviaTask(org.jdesktop.application.Application app) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to VistaPreviaTask fields, here.
            super(app);
        }
        @Override protected Object doInBackground() {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.
            return null;  // return your result
        }
        @Override protected void succeeded(Object result) {
            // Runs on the EDT.  Update the GUI based on
            // the result computed by doInBackground().
        }
    }

    @Action
    public void help() {
        UtilRender.openDialogHelp(JInternalFrameVisor.class, getTitle());
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButtonCerrar;
    private javax.swing.JButton jButtonSeleccionar;
    private javax.swing.JButton jButtonVistaPrevia;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JTree jTreeColeccion;
    private javax.swing.JLabel jlblEEstructuraAnalizada;
    // End of variables declaration//GEN-END:variables

}
